package imaLogin

import (
	"context"
	"crypto/tls"
	"fmt"
	"local/config"
	"local/service_manager"
	"net/http"
	"time"
	"youdu"

	"github.com/gin-gonic/gin"
)

var sso *youdu.Sso

// Service 定义demo2服务结构
type Service struct {
	name        string
	description string
	server      *http.Server
	lastError   *service_manager.ServiceError
	demoClient  *http.Client
}

// NewService 创建新的demo2服务实例
func NewService() *Service {
	return &Service{
		name:        "ima_login_service",
		description: "有度插件 - SSO登录客户端",
		demoClient:  &http.Client{Timeout: 5 * time.Second},
	}
}

// GetName 获取服务名称
func (s *Service) GetName() string {
	return s.name
}

// GetDescription 获取服务描述
func (s *Service) GetDescription() string {
	return s.description
}

// GetDependencies 获取服务依赖
func (s *Service) GetDependencies() []string {
	// Demo2服务依赖于demo服务
	return []string{}
}

// GetLastError 获取最后一次错误
func (s *Service) GetLastError() *service_manager.ServiceError {
	return s.lastError
}

// OnStart 服务启动前的初始化
func (s *Service) OnStart(ctx context.Context) error {

	sso = &youdu.Sso{}
	updateConfig()
	err := sso.SaveSecret()
	if err != nil {
		return fmt.Errorf("有度数据库失败：%s", err.Error())
	}
	// 初始化路由
	r := gin.Default()
	// 静态文件
	r.LoadHTMLFiles("./templates/imaLogin/error.html", "./templates/imaLogin/client.html")
	// 使用绝对路径加载静态文件
	r.StaticFile("/", "./templates/imaLogin/index.html")
	// api
	api := r.Group("/api")
	{
		api.GET("/status", func(c *gin.Context) {
			c.JSON(200, gin.H{
				"status":  "running",
				"service": s.name,
			})
		})
	}
	r.GET("/login", LoginClient)
	// 如果 CertFile 和 KeyFile 不为空，则使用TLS
	if config.Inst.ServiceYouSSO.CertFile != "" && config.Inst.ServiceYouSSO.KeyFile != "" {
		cert, err := tls.LoadX509KeyPair(config.Inst.ServiceYouSSO.CertFile, config.Inst.ServiceYouSSO.KeyFile)
		if err != nil {
			return fmt.Errorf("加载TLS证书失败: %v", err)
		}
		s.server = &http.Server{
			Addr:    fmt.Sprintf(":%s", config.Inst.ServiceYouSSO.Port),
			Handler: r,
			TLSConfig: &tls.Config{
				Certificates: []tls.Certificate{cert},
			},
		}
	} else {
		s.server = &http.Server{
			Addr:    fmt.Sprintf(":%s", config.Inst.ServiceYouSSO.Port),
			Handler: r,
		}
	}

	return nil
}

// Entry 服务入口函数
func (s *Service) Entry(ctx context.Context) error {
	// 在goroutine中启动HTTP服务器
	errChan := make(chan error, 1)
	go func() {
		var err error
		if s.server.TLSConfig != nil {
			err = s.server.ListenAndServeTLS(config.Inst.ServiceYouSSO.CertFile, config.Inst.ServiceYouSSO.KeyFile)
		} else {
			err = s.server.ListenAndServe()
		}
		if err != nil && err != http.ErrServerClosed {
			errChan <- fmt.Errorf("HTTP服务器错误: %v", err)
		}
		close(errChan)
	}()

	// 等待上下文取消或服务器错误
	select {
	case <-ctx.Done():
		return nil
	case err := <-errChan:
		if err != nil {
			s.lastError = &service_manager.ServiceError{
				Message: "服务运行失败",
				Details: err.Error(),
			}
			return err
		}
		return nil
	}
}

// OnStop 服务停止前的清理
func (s *Service) OnStop(ctx context.Context) error {
	if s.server != nil {
		// 优雅关闭HTTP服务器
		if err := s.server.Shutdown(ctx); err != nil {
			return fmt.Errorf("关闭HTTP服务器失败: %v", err)
		}
	}
	return nil
}

func updateConfig() {
	sso.Buin = config.Inst.Entprise.Buin
	sso.Server = config.Inst.Entprise.YouduServer
	sso.Secret = config.Inst.ServiceYouSSO.Secret
	sso.YouduDBServer = config.Inst.ServiceYouSSO.YouduDBServer
	sso.YouduDBPort = config.Inst.ServiceYouSSO.YouduDBPort
	sso.YouduDBUser = config.Inst.ServiceYouSSO.YouduDBUser
	sso.YouduDBPassword = config.Inst.ServiceYouSSO.YouduDBPassword
}
